/**
 * ***************************************************************************** Copyright (c) 2007,
 * 2008 IBM Corporation and others. All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0 which accompanies this
 * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
 *
 * <p>Contributors: IBM Corporation - initial API and implementation
 * *****************************************************************************
 */
package org.eclipse.ltk.internal.core.refactoring.resource;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.IPath;
import org.eclipse.ltk.core.refactoring.RefactoringContribution;
import org.eclipse.ltk.core.refactoring.RefactoringDescriptor;
import org.eclipse.ltk.core.refactoring.resource.DeleteResourcesDescriptor;

public class DeleteResourcesRefactoringContribution extends RefactoringContribution {
  private static final String TRUE = "true"; // $NON-NLS-1$
  private static final String FALSE = "false"; // $NON-NLS-1$
  private static final String ATTRIBUTE_DELETE_CONTENTS = "deleteContents"; // $NON-NLS-1$
  /** Key used for the number of resource to be deleted */
  private static final String ATTRIBUTE_NUMBER_OF_RESOURCES = "resources"; // $NON-NLS-1$

  /**
   * Key prefix used for the path of the resource to be deleted
   *
   * <p>The element arguments are simply distinguished by appending a number to the argument name,
   * e.g. element1. The indices of this argument are one-based.
   */
  private static final String ATTRIBUTE_ELEMENT = "element"; // $NON-NLS-1$

  /* (non-Javadoc)
   * @see org.eclipse.ltk.core.refactoring.RefactoringContribution#retrieveArgumentMap(org.eclipse.ltk.core.refactoring.RefactoringDescriptor)
   */
  public Map retrieveArgumentMap(RefactoringDescriptor descriptor) {
    if (descriptor instanceof DeleteResourcesDescriptor) {
      DeleteResourcesDescriptor deleteDesc = (DeleteResourcesDescriptor) descriptor;
      HashMap map = new HashMap();
      IPath[] resources = deleteDesc.getResourcePaths();
      String project = deleteDesc.getProject();
      map.put(ATTRIBUTE_NUMBER_OF_RESOURCES, String.valueOf(resources.length));
      for (int i = 0; i < resources.length; i++) {
        map.put(
            ATTRIBUTE_ELEMENT + (i + 1),
            ResourceProcessors.resourcePathToHandle(project, resources[i]));
      }

      map.put(ATTRIBUTE_DELETE_CONTENTS, deleteDesc.isDeleteContents() ? TRUE : FALSE);
      return map;
    }
    return Collections.EMPTY_MAP;
  }

  /* (non-Javadoc)
   * @see org.eclipse.ltk.core.refactoring.RefactoringContribution#createDescriptor()
   */
  public RefactoringDescriptor createDescriptor() {
    return new DeleteResourcesDescriptor();
  }

  /* (non-Javadoc)
   * @see org.eclipse.ltk.core.refactoring.RefactoringContribution#createDescriptor(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.util.Map, int)
   */
  public RefactoringDescriptor createDescriptor(
      String id, String project, String description, String comment, Map arguments, int flags)
      throws IllegalArgumentException {
    String del = (String) arguments.get(ATTRIBUTE_DELETE_CONTENTS);

    try {
      int numResources = Integer.parseInt((String) arguments.get(ATTRIBUTE_NUMBER_OF_RESOURCES));
      if (numResources < 0 || numResources > 100000) {
        throw new IllegalArgumentException(
            "Can not restore DeleteResourcesDescriptor from map, number of moved elements invalid"); // $NON-NLS-1$
      }

      IPath[] resourcePaths = new IPath[numResources];
      for (int i = 0; i < numResources; i++) {
        String resource = (String) arguments.get(ATTRIBUTE_ELEMENT + String.valueOf(i + 1));
        if (resource == null) {
          throw new IllegalArgumentException(
              "Can not restore DeleteResourcesDescriptor from map, resource missing"); // $NON-NLS-1$
        }
        resourcePaths[i] = ResourceProcessors.handleToResourcePath(project, resource);
      }

      if (resourcePaths.length > 0) {
        DeleteResourcesDescriptor descriptor = new DeleteResourcesDescriptor();
        descriptor.setProject(project);
        descriptor.setDescription(description);
        descriptor.setComment(comment);
        descriptor.setFlags(flags);
        descriptor.setResourcePaths(resourcePaths);
        descriptor.setDeleteContents(TRUE.equals(del));
        return descriptor;
      }
    } catch (NumberFormatException e) {
      throw new IllegalArgumentException(
          "Can not restore DeleteResourcesDescriptor from map"); // $NON-NLS-1$
    }
    throw new IllegalArgumentException(
        "Can not restore DeleteResourceDescriptor from map"); // $NON-NLS-1$
  }
}
